Pocitani odkazu u Interface

Otázka od: Krakora Martin

4. 10. 2004 9:11

Zdravim vsechny,

  delam si neco jako jednoduchy framework, ktery bude cist urcita data z
tabulek databaze FB.Chci to udelat jako COM objekty, za kterych potom budou
ty data ziskavat clienti.
  Mam jeden objekt, ktery implementuje rozhrani.Tento objekt lze vytvorit z
klienta pomoci jeho CoClass, ostatni COM objekty jsou hiearchicky vnoreny za
timto objektem, tudiz se prubezne vytvareji (potomci tridy TAutoIntnfObject,
implementujici dana rozhrani). Tyto objekty vytvarim tedy volanim jejich
kontruktoru a vzdy jim v konstruktoru predavam odkaz na objekt Parenta, tedy
objektu ktery jej vytvoril.
Problem nastal v momente, kdyz jsem vytvoril vice vnorenych objektu, zacali
se mi totiz samovolne rusit. Coz pripisuji mechanizmu pocitani odkazu na
rozhranni, jelikoz
jsem si v kazdem objektu drzel pouze odkaz na objekt sve vlastnika a treba
dalsi objekt, v hiearchii pod nim. Tak podle meho usudku dochazelo k
uvolneni objektu v dusledku nuloveho poctu odkazu na rozhrani.
  Z toho vyplyvaji tyto otazky:

  1) je muj usudek spravny?

  2) jak to vyresit jinak? Drzet v kazdem objektu odkaz na dalsi objekt a
zaroven na jeho rozhrani?

  Je to pro mne dost dulezite jelikoz ten prvni objekt obsahuje zaroven i
objekt tridy TIBDatabase a ty ostatni objekty ctou data, kazdy z jine
tabulky, a potrebuju jim predavat odkaz na objekt pripojeni k DB.

  snad jsem to popsal dost presne, predem moc diky za kazde nakopnuti

  S pozdravem a diky Krakora M.



Odpovedá: Radim Kunz

4. 10. 2004 11:06

Krakora Martin napsal(a):

>Zdravim vsechny,
>
> delam si neco jako jednoduchy framework, ktery bude cist urcita data z
>tabulek databaze FB.Chci to udelat jako COM objekty, za kterych potom budou
>ty data ziskavat clienti.
> Mam jeden objekt, ktery implementuje rozhrani.Tento objekt lze vytvorit z
>klienta pomoci jeho CoClass, ostatni COM objekty jsou hiearchicky vnoreny za
>timto objektem, tudiz se prubezne vytvareji (potomci tridy TAutoIntnfObject,
>implementujici dana rozhrani). Tyto objekty vytvarim tedy volanim jejich
>kontruktoru a vzdy jim v konstruktoru predavam odkaz na objekt Parenta, tedy
>objektu ktery jej vytvoril.
>Problem nastal v momente, kdyz jsem vytvoril vice vnorenych objektu, zacali
>se mi totiz samovolne rusit. Coz pripisuji mechanizmu pocitani odkazu na
>rozhranni, jelikoz
>jsem si v kazdem objektu drzel pouze odkaz na objekt sve vlastnika a treba
>dalsi objekt, v hiearchii pod nim. Tak podle meho usudku dochazelo k
>uvolneni objektu v dusledku nuloveho poctu odkazu na rozhrani.
> Z toho vyplyvaji tyto otazky:
>
> 1) je muj usudek spravny?
>
> 2) jak to vyresit jinak? Drzet v kazdem objektu odkaz na dalsi objekt a
>zaroven na jeho rozhrani?
>
> Je to pro mne dost dulezite jelikoz ten prvni objekt obsahuje zaroven i
>objekt tridy TIBDatabase a ty ostatni objekty ctou data, kazdy z jine
>tabulky, a potrebuju jim predavat odkaz na objekt pripojeni k DB.
>
> snad jsem to popsal dost presne, predem moc diky za kazde nakopnuti
>
> S pozdravem a diky Krakora M.
>
>
>
>
Usudek je zrejme spravny, jenom nechapu (pokud jsem dobre pochopil text),
proc vlastnikovi rikas vlastnik, kdyz nevlastni (nema na ne odkaz) sve
child objekty.
Hlavni zasada je: jednou rozhrani, vzdycky rozhrani. Pokud pracujes s
rozhranimi,
na normalni delphi odkazy zapomen, jed jen pres rozhrani. Dale kazdy objekt
musi byt nekym vlastnen, a to samozrejme pres rozhrani. A pozor v
konstruktoru
a destruktoru, tam je pocet referenci na 0, jakokoliv pouziti rozhrani
sam na sebe
a jeho nepredani ven znamena zruseni objektu. Hlavne v destruktoru, tam se
muzes pekne zacyklit.

Radim

Odpovedá: Krakora Martin

4. 10. 2004 11:29


> Usudek je zrejme spravny, jenom nechapu (pokud jsem dobre
> pochopil text), proc vlastnikovi rikas vlastnik, kdyz
> nevlastni (nema na ne odkaz) sve child objekty.
> Hlavni zasada je: jednou rozhrani, vzdycky rozhrani. Pokud
> pracujes s rozhranimi, na normalni delphi odkazy zapomen, jed
> jen pres rozhrani. Dale kazdy objekt musi byt nekym vlastnen,
> a to samozrejme pres rozhrani. A pozor v konstruktoru a
> destruktoru, tam je pocet referenci na 0, jakokoliv pouziti
> rozhrani sam na sebe a jeho nepredani ven znamena zruseni
> objektu. Hlavne v destruktoru, tam se muzes pekne zacyklit.
>
> Radim
>
>

  Asi jsem nezvolil spravny vyraz - vlastnik. Ty odkazy jsou kvuli tomu,
abych se vzdy dobral k tomu prvnimu objektu, ktery ma jako vlastnost objekt
tridy TIBDatabase, ktery zase potrebuji v objektech dale pro objekty
TIBQuery. Proto to nemuze drzet jen odkazy na rozhrani, protoze nevim jaky
bych si tenhle objekt (TIBDatabase) mezi nima predaval. Asi na to jdu uplne
spatne, je to moje prvni vec tohohle typu. Taky mi to nepripada prilis
ciste, ale nevim jak to jinak vyresi. Jedine me napada udelat globalni
promennou s odkazem na ten objekt pro db pripojeni. Asi by to ted nemel byt
problem, kdyz jedou vsechny objekty v jednom vlakne.

  Martin